"""
@Time : 2022/3/28
@Author : 马绪旭
@File : 文件分类
@Description : 三种方法放在了一个文件中，还是建议使用拆分的三个文件，对应三种方法
应该移动到那个目录下
"""
import os
import shutil
import keyboard

"""
第一步，根据文件后缀移动到相对应格式目录下
"""

# 提升作用域，可以全局使用此变量
filepath = 'D:\\test2\\'
listdir = os.listdir(filepath)

type_lists = ['软考', '学习视频', '学习资料', '游戏', '考研']
num_lists = ['a', '2', '3', '4', '5']
sum_lists = []
for tl, nl in zip(type_lists, num_lists):
    sum_lists.append('{{ ' + nl + ' ==>> ' + tl + ' }}')

template_filepath = filepath + '同名文件自判断'


# 创建目录并移动文件方法
def create_filepath(filename, old_filepath, new_filepath):
    # 判断目标文件夹是否存在，不存在则创建
    if not os.path.exists(new_filepath):
        os.mkdir(new_filepath)
        # print(r'创建文件夹:{}'.format(new_filepath))
    else:
        # 判断有没有同名文件，没有则移动，有就pass
        if not os.path.exists(new_filepath + "\\" + filename):
            try:
                shutil.move(old_filepath, new_filepath)
            except:
                pass
            else:
                print(r"文件从【{}】移动到【{}】".format(old_filepath, new_filepath))
                print("================确认操作，请按回车！！！否则无法判断下一个文件================")
                print('\t')
        else:
            if not os.path.exists(template_filepath):
                os.mkdir(template_filepath)
            try:
                shutil.move(old_filepath, template_filepath)
            except:
                pass
            else:
                print(f'同名文件自行判断')
                print("================确认操作，请按回车！！！否则无法判断下一个文件================")
                print('\t')


# 1.思路一：自定义文件类型，按照自己定义的类型进行匹配；好处在于可以自己决定扫描和移动什么文件
def detect_file_type(file, file_type):
    if file.endswith(file_type):
        # print(file)
        # 传入创建目录
        new_file_path = filepath + file_type
        old_file_path = filepath + file
        # 调用移动方法
        create_filepath(old_file_path, new_file_path)


def move_file1():
    count_sum = 0
    count_file = 0
    count_dir = 0
    for file in listdir:
            # 判断后缀名是什么类型的，此处是直接判断好，思路二：不判断直接根据后缀创建一个目录移动进去（更智能）
        filetype_list = ['exe', 'zip', 'txt']

        if os.path.isfile(filepath + file):
            # 有可能文件没有后缀，考虑此情况
            print(file)
            try:
                # 思路一：按照列表里定义好的进行分类
                for filetype in filetype_list:
                    detect_file_type(file, filetype)

            except:
                print(r"【{}】文件没有后缀类型，请自己判断".format(file))
            # finally:
            #     print(filetype)

            count_file += 1
        else:
            count_dir += 1
        count_sum += 1

    print(r'总计扫描到的文件数【{}】和目录数【{}】,总计扫描到【{}】'.format(count_file, count_dir, count_sum))


# 2.思路二：自动扫描目录下的文件后缀，并创建相对应的文件夹
def auto_detect_file_type(file, file_type):
    new_file_path = filepath + file_type
    old_file_path = filepath + file
    create_filepath(old_file_path, new_file_path)


def move_file2():
    count_sum = 0
    count_file = 0
    count_dir = 0
    for file in listdir:
        # 思路二：不判断直接根据后缀创建一个目录移动进去（更智能）

        if os.path.isfile(filepath + file):
            # 有可能文件没有后缀，考虑此情况
            print(file)
            try:
                # 思路二：自动扫描后缀创建相对应的目录，然后进行分类
                filetype = file.split('.')[1]
                auto_detect_file_type(file, filetype)
            except:
                print(r"【{}】文件没有后缀类型，请自己判断".format(file))
            # finally:
            #     print(filetype)

            count_file += 1
        else:
            count_dir += 1
        count_sum += 1

    print(r'总计扫描到的文件数【{}】和目录数【{}】,总计扫描到【{}】'.format(count_file, count_dir, count_sum))


"""
    第二步：扫描文件名判断为何种类型
"""


# 执行移动操作
def move_file_to(filename, filetype):
    new_file_path = filepath + filetype
    old_file_path = filepath + filename
    create_filepath(filename, old_file_path, new_file_path)


# 监听按键，设置热键
def listen_keyboard(filename):
    for filetype, num in zip(type_lists, num_lists):
        keyboard.add_hotkey(num, move_file_to, args=(filename, filetype), suppress=False)
    keyboard.wait('enter')


def move_file_by_key():
    for filename in listdir:
        if os.path.isfile(filepath + filename):
            # filetype = file.split('.')[1]
            print(r"1移动文件【{}】,并选择以下按键以便分类".format(filename))
            print(sum_lists)
            listen_keyboard(filename)


if __name__ == '__main__':
    # 自定义后缀分类方法
    # move_file1()

    # 自动化后缀分类方法
    # move_file2()

    # 键位监听判断分类方法
    move_file_by_key()
